package com.iscas.green.extralindextest.service;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 文件IO服务，用于写入和读取文件
 */
@Service
public class FileIOService {
    
    private static final Logger log = LoggerFactory.getLogger(FileIOService.class);
    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd-HHmmss");
    
    @Value("${app.file.output-dir:./logs}")
    private String outputDirectory;
    
    /**
     * 写入信息到文件
     * 
     * @param content 写入内容
     * @param filename 文件名（可选），如果为空则自动生成
     * @return 写入结果消息
     */
    public String writeToFile(String content, String filename) {
        // 创建输出目录
        File dir = new File(outputDirectory);
        if (!dir.exists() && !dir.mkdirs()) {
            String errorMsg = "无法创建输出目录: " + outputDirectory;
            log.error(errorMsg);
            return errorMsg;
        }
        
        // 如果文件名为空，创建包含时间戳的文件名
        if (filename == null || filename.trim().isEmpty()) {
            filename = "output-" + dateFormat.format(new Date()) + ".txt";
        }
        
        // 确保文件名有.txt后缀
        if (!filename.endsWith(".txt")) {
            filename += ".txt";
        }
        
        // 构建完整文件路径
        String filePath = outputDirectory + File.separator + filename;
        log.info("准备写入文件: {}", filePath);
        
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) {
            // 添加时间戳前缀
            String timestampedContent = String.format("[%s] %s%n", 
                    dateFormat.format(new Date()), content);
            
            writer.write(timestampedContent);
            writer.flush();
            
            log.info("成功写入内容到文件: {}", filePath);
            return "成功写入内容到文件: " + filePath;
        } catch (IOException e) {
            String errorMsg = "写入文件时发生错误: " + e.getMessage();
            log.error(errorMsg, e);
            return errorMsg;
        }
    }
    
    /**
     * 读取文件内容
     * 
     * @param filename 文件名
     * @return 文件内容
     */
    public String readFromFile(String filename) {
        String filePath = outputDirectory + File.separator + filename;
        log.info("准备读取文件: {}", filePath);
        
        try {
            Path path = Paths.get(filePath);
            if (!Files.exists(path)) {
                return "文件不存在: " + filePath;
            }
            
            List<String> lines = Files.readAllLines(path);
            return lines.stream().collect(Collectors.joining("\n"));
        } catch (IOException e) {
            String errorMsg = "读取文件时发生错误: " + e.getMessage();
            log.error(errorMsg, e);
            return errorMsg;
        }
    }
    
    /**
     * 列出输出目录中的所有文件
     * 
     * @return 文件列表
     */
    public List<String> listFiles() {
        try {
            return Files.list(Paths.get(outputDirectory))
                    .filter(Files::isRegularFile)
                    .map(path -> path.getFileName().toString())
                    .collect(Collectors.toList());
        } catch (IOException e) {
            log.error("列出文件时发生错误", e);
            throw new RuntimeException("列出文件时发生错误: " + e.getMessage(), e);
        }
    }
} 